package com.hongxin.doc.common.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;

import java.util.Date;
import java.util.Map;

public class JwtUtil {

    /**
     * jwt有效时长
     * 单位：毫秒
     * 默认为1天
     */
    private static final long expired = 3600000L * 24 * 365;

    public static String generateToken(String payloadClaims, String secretKey) {
        // 创建 HMAC-SHA256 算法实例
        Algorithm algorithm = Algorithm.HMAC256(secretKey);

        // 构建 JWT 并设置声明（claims）
        return JWT.create()
                // 如果有需要，可以在这里添加标准声明，例如 iss、aud、iat、exp、nbf、sub 和 jti
//                .withIssuedAt(new Date()) // 可选：签发时间
//                .withExpiresAt(new Date(System.currentTimeMillis() + 3600 * 1000)) // 可选：过期时间
                .withPayload(payloadClaims) // 设置自定义负载
                .sign(algorithm); // 使用指定算法签名
    }

    /**
     * 生成jwt字符串
     * jwt有效期为1小时
     * @param payload 载荷数据
     * @param secretKey 密钥
     * @return jwt字符串
     */
//    public static String generateToken(String payload, String secretKey) {
//        if (payload.equals("")) {
//            return "";
//        }
//
//        return JWT.create().withAudience(payload).sign(Algorithm.HMAC256(secretKey));
//    }

    /**
     * 生成jwt字符串
     * jwt有效期为1小时
     * @param payload 载荷数据
     * @param secretKey 密钥
     * @param expired 有效期
     * @return jwt字符串
     */
    public static String generateToken(String payload, String secretKey, Long expired) {
        if (payload.equals("")) {
            return "";
        }

        Date expiresDate = new Date(System.currentTimeMillis() + expired);
        return JWT.create().withAudience(payload).withExpiresAt(expiresDate).sign(Algorithm.HMAC256(secretKey));
    }

    public static String decode(String token) {
        return JWT.decode(token).getAudience().get(0);
    }

    /**
     * 验证token是否有效
     * @param token token str
     * @param secretKey 密钥
     * @return boolean
     */
    public static boolean verifyToken(String token, String secretKey) {
        try{
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secretKey)).build();
            jwtVerifier.verify(token);
        } catch (Exception e) {
            return false;
        }
        return true;
    }
}
